package com.offcn.order.service.impl;

import com.alibaba.fastjson.JSON;
import com.offcn.entity.Cart;
import com.offcn.order.service.CartService;
import com.offcn.pojo.OrderItem;
import com.offcn.sellergood.feign.ItemFeign;
import com.offcn.sellergood.pojo.Item;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

@Service
public class CartServiceImpl implements CartService {
    // 在该模块中导入远程调用的接口所在的依赖并注入(注意主启动加注解)
    @Autowired
    private ItemFeign itemFeign;

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    /*@Autowired
    private RedisTemplate redisTemplate;*/

    // 从redis中获取购物车列表
    @Override
    public List<Cart> findCartListFromRedis(String username) {
        /*List<Cart> cartList = (List<Cart>)redisTemplate.boundHashOps("cartList").get(username);
        return cartList;*/
        String cartListStr = (String)stringRedisTemplate.boundHashOps("cartList").get(username);
        List<Cart> carts = JSON.parseArray(cartListStr, Cart.class);
        return carts;
    }
    // 将购物车列表添加到redis中
    @Override
    public void saveCartListToRedis(String username, List<Cart> cartList) {
        /*redisTemplate.boundHashOps("cartList").put(username,cartList);*/
        String cartListStr = JSON.toJSONString(cartList);
        stringRedisTemplate.boundHashOps("cartList").put(username,cartListStr);
    }
    /**
     * @description: 如何添加购物车，根据三种情况
     * @analyze: 1. 不同的商家作为一个购物车，新添加的商品来自于新商家的话，需要新添加购物车到购物车列表
     *           2. 添加的商品来自于同一个商家，则需要在该商家的购物车中，添加该商品即可
     *           3. 添加的商品来自于同一个商家的已经添加的商品，则需要更改商品的数量和合计即可。
     */
    @Override
    public List<Cart> addGoodsToCartList(Long itemId, Integer num, List<Cart> cartList) {
        // 一、先获取商品的信息，并确定当前商品存在且不是下架和删除状态
        Item item = itemFeign.findById(itemId).getData();
        if (item == null) {
            throw new RuntimeException("当前商品不存在");
        }else if(!item.getStatus().equals("1")){
            throw new RuntimeException("当前商品状态不正常(下架或删除)");
        }
        // 二、获取商家的id和商家的名称
        String sellerId = item.getSellerId(); // 商家id
        String sellerName = item.getSeller(); // 商家名

        // 三.1、判断当前商品的商家id，是否已经在购物车列表存在
        Cart cart = findCartById(cartList, sellerId);
        if (cart == null) {
            // 当前商品不存在于购物车中：新商品订单=>商品订单列表=>新购物车=>购物车列表中
            cart = new Cart();
            cart.setSellerId(sellerId); // 将商家的id和名称添加到cart中
            cart.setSellerName(sellerName);
            OrderItem orderItem = addOrderItem(item, num);
            ArrayList<OrderItem> orderItems = new ArrayList<>();
            orderItems.add(orderItem); // 现将获取到的商品订单添加到商品订单列表中
            cart.setOrderItemList(orderItems);// 在将商品订单列表添加到购物车中
            cartList.add(cart); // 最终将新生成的购物车添加到购物车列表中。
        }else {
            // 当前商品的商家id已经存在,那么有分成俩种情况
            // 三.2、商品是不在已经选购的商品订单列表中
            // 三.3、商品是在已经选购的商品订单列表中
            // 则判断当前商品的id,是否已经在商品订单列表中
            OrderItem orderItem = findOrderById(cart.getOrderItemList(), itemId);
            if (orderItem == null) {
                // 当前商品不存在与商品订单列表中：新商品订单=>商品订单列表=>购物车列表中
                orderItem = addOrderItem(item, num);
                cart.getOrderItemList().add(orderItem);
            }else {
                // 当前商品已经存在与商品订单列表中：修改商品订单的数量、商品的总金额
                orderItem.setNum(orderItem.getNum()+num);
                orderItem.setTotalFee(orderItem.getPrice().multiply(new BigDecimal(orderItem.getNum())));

                // 对于商品的修改的，有可能存在0的情况
                if (orderItem.getNum().equals(0))
                    // 则直接删除该订单
                    cart.getOrderItemList().remove(orderItem);

                // 对于购物车的修改的，有可能某个购物车存在0的情况
                if (cart.getOrderItemList().size() == 0)
                    cartList.remove(cart);
            }
        }
        return cartList;
    }

    /**
     * @param: 购物车列表、商家id
     * @return: 购物车
     * @description: 判断当前商品的商家id，是否已经在购物车列表存在
     * @analyze: 存在，返回该购物车即可，不存在，返回空
     */
    private Cart findCartById(List<Cart> cartList,String sellerId){
        for (Cart cart : cartList) {
            if (cart.getSellerId().equals(sellerId)){
                return cart;
            }
        }
        return null;
    }
    /**
     * @param: 商品的信息、要添加商品的数量
     * @return: 商品的订单信息=商品的信息+商品的数量
     * @description: 将商品的信息添加到商品的订单信息中。此时不需要设置主键id和订单编号
     */
    private OrderItem addOrderItem(Item item,Integer num){
        OrderItem orderItem = new OrderItem();
        orderItem.setItemId(item.getId()); //商品id，同时也是商品编号
        orderItem.setGoodsId(item.getGoodsId());//SPU_ID
        orderItem.setTitle(item.getTitle()); //商品标题
        orderItem.setPrice(item.getPrice()); //商品单价
        orderItem.setPicPath((item.getImage()));//商品图片地址
        orderItem.setSellerId(item.getSellerId());// 商家id
        orderItem.setNum(num);//商品购买数量
        orderItem.setTotalFee(new BigDecimal(num).multiply(orderItem.getPrice())); //商品总金额
        return orderItem;
    }
    /**
     * @param: 订单列表、商品id
     * @return: 订单信息
     * @description: 判断当前商品是否在商品订单列表中存在
     * @analyze: 存在，返回该订单即可，不存在，返回空
     */
    private OrderItem findOrderById(List<OrderItem> orderItemList,Long itemId){
        for (OrderItem orderItem : orderItemList) {
            if (orderItem.getItemId().equals(itemId)){
                return orderItem;
            }
        }
        return null;
    }
}
